// 使用 filter() 方法，结合 Map() 对象

function unique(arr) {
  const map = new Map();
  return arr.filter(item =>
    // 若 map 已包含该元素（ map.has(item) 为 true ），返回 false （过滤掉重复元素）。
    // 若 map 不包含该元素，通过 map.set(item, true) 记录该元素，并返回 true （保留该元素）。
    map.has(item) ? false : map.set(item, true)
  );
}

// 示例
console.log(unique([1, 2, 2, NaN, NaN])); // [1, 2, NaN]



// filter() 是 JavaScript 数组的高阶函数
// 用于筛选数组中符合条件的元素，返回一个新数组，不改变原数组。
// const newArray = arr.filter(callback(element, index, array));
// callback：测试每个元素的函数，返回 true 保留元素，false 过滤掉


//                  Map                 	    Object
// 键的类型	 任意类型（包括对象、函数等）  	仅限字符串或 Symbol
// 键的顺序	     保持插入顺序	          无序（ES6 后也有序但不保证）
// 大小获取	     map.size 属性	     手动计算 (Object.keys().length)
// 性能	        频繁增删操作更优	            频繁查找略快
// 默认键	           无	               有原型链属性（如 toString）